{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Live Risk and Performance Predict\n",
    "\n",
    "### Summary \n",
    "\n",
    "While we are working on delivering live risk in gs-quant, computing risk real-time for large portfolios can be computationaly expensive. In this notebook, I team up with FICC Derivatives' David Vanden Bon to introduce a simple and lightweight framework for approximating it. This means you can compute your end of day risk and connect a live market feed to this code to estimate how performance, delta and gamma risk are changing for your book in real time. \n",
    "\n",
    "You can also use this framework to predict performance - that is, estimate impact of a hypothetical market move, which can be a useful risk management tool.\n",
    "\n",
    "More specifically, we do this by calculating a delta ladder for our portfolio via applying a number of spot shocks. We use the delta values to fit a polynomial for each instrument in the curve and then use this polynomial to appriximate delta, gamma and pnl for any given market move in these instruments.\n",
    "\n",
    "Let's get started!\n",
    "\n",
    "Don't forget to check out the [What's New](#What's-New) section for the latest gs-quant additions.\n",
    "\n",
    "The content of this notebook is split into:\n",
    "* [1 - Let's get started with gs quant](#1---Let's-get-started-with-gs-quant)\n",
    "* [2 - Create or load portfolio](#2---Create-or-load-portfolio)\n",
    "* [3 - Calculate delta ladder](#3---Calculate-delta-ladder)\n",
    "* [4 - Fit polynomial](#4---Fit-polynomial)\n",
    "* [5 - Estimate performance and risk for any market move](#5---Estimate-performance-and-risk-for-any-market-move)\n",
    "* [What's New](#What's-New)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1 - Let's get started with gs quant\n",
    "Start every session with authenticating with your unique client id and secret. If you don't have a registered app, create one [here](https://marquee.gs.com/s/developer/myapps/register). `run_analytics` scope is required for the functionality covered in this example. Below produced using gs-quant version 0.8.130."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "from gs_quant.session import GsSession\n",
    "GsSession.use(client_id=None, client_secret=None, scopes=('run_analytics',))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2 - Create or load portfolio\n",
    "\n",
    "The goal for this section is to load your own book. If you are an internal user please reach out for ways to connect your book.\n",
    "\n",
    "If you are an external user, we have additional natural language processing tools to help map your book coming soon! \n",
    "\n",
    "For this note, I'll create a sample portfolio of a combination of 3m, 1y, 2y and 3y expiry payer and receiver swaptions on 5y, 10y, 15y and 20y tails struck 10, 20 and 30bps OTMF and resolve it to fix all the relative parameters."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "from gs_quant.instrument import IRSwaption\n",
    "from gs_quant.markets.portfolio import Portfolio\n",
    "from gs_quant.common import PayReceive, Currency\n",
    "\n",
    "ccy = Currency.USD\n",
    "payers = [IRSwaption(PayReceive.Pay, termination_date='{}y'.format(t), notional_currency=ccy, \n",
    "                     expiration_date='{}m'.format(e), strike='a+{}'.format(s)) \n",
    "          for t in [5, 10, 15, 20] for e in [3, 12, 24, 36] for s in [10, 20, 30]]\n",
    "\n",
    "receivers = [IRSwaption(PayReceive.Receive, termination_date='{}y'.format(t), notional_currency=ccy, \n",
    "                     expiration_date='{}m'.format(e), strike='a-{}'.format(s)) \n",
    "          for t in [5, 10, 15, 20] for e in [3, 12, 24, 36] for s in [10, 20, 30]]\n",
    "\n",
    "portfolio = Portfolio(payers + receivers)\n",
    "portfolio.resolve()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3 - Calculate Delta Ladder\n",
    "\n",
    "Now let's take our portfolio and calculate a delta ladder by shocking spot with varying shifts (where 0 our portfolio delta without any shocks applied). Each row in the resulting dataframe corresponds to a different instrument. We will use this delta information to fit a polynomial for each of these instruments in the next step."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mkt_type</th>\n",
       "      <th>mkt_asset</th>\n",
       "      <th>mkt_class</th>\n",
       "      <th>mkt_point</th>\n",
       "      <th>-50</th>\n",
       "      <th>-40</th>\n",
       "      <th>-30</th>\n",
       "      <th>-20</th>\n",
       "      <th>-10</th>\n",
       "      <th>-5</th>\n",
       "      <th>-2</th>\n",
       "      <th>0</th>\n",
       "      <th>2</th>\n",
       "      <th>5</th>\n",
       "      <th>10</th>\n",
       "      <th>20</th>\n",
       "      <th>30</th>\n",
       "      <th>40</th>\n",
       "      <th>50</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>IR</td>\n",
       "      <td>USD</td>\n",
       "      <td>CASH</td>\n",
       "      <td>O/N</td>\n",
       "      <td>-96.652300</td>\n",
       "      <td>-87.508851</td>\n",
       "      <td>-80.140622</td>\n",
       "      <td>-74.702595</td>\n",
       "      <td>-71.280237</td>\n",
       "      <td>-70.330161</td>\n",
       "      <td>-70.001395</td>\n",
       "      <td>-69.881709</td>\n",
       "      <td>-69.840876</td>\n",
       "      <td>-69.925542</td>\n",
       "      <td>-70.448960</td>\n",
       "      <td>-72.866759</td>\n",
       "      <td>-76.972091</td>\n",
       "      <td>-82.564403</td>\n",
       "      <td>-89.423074</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>IR</td>\n",
       "      <td>USD</td>\n",
       "      <td>CASH</td>\n",
       "      <td>CASH STUB</td>\n",
       "      <td>19236.462658</td>\n",
       "      <td>15938.264198</td>\n",
       "      <td>12100.009823</td>\n",
       "      <td>7851.226480</td>\n",
       "      <td>3375.412126</td>\n",
       "      <td>1107.540696</td>\n",
       "      <td>-251.889772</td>\n",
       "      <td>-1155.410051</td>\n",
       "      <td>-2055.450143</td>\n",
       "      <td>-3397.138702</td>\n",
       "      <td>-5601.994693</td>\n",
       "      <td>-9838.668869</td>\n",
       "      <td>-13744.821189</td>\n",
       "      <td>-17227.777252</td>\n",
       "      <td>-20248.264302</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>IR</td>\n",
       "      <td>USD</td>\n",
       "      <td>FRA</td>\n",
       "      <td>JUN20</td>\n",
       "      <td>58295.744762</td>\n",
       "      <td>48164.753974</td>\n",
       "      <td>36542.379396</td>\n",
       "      <td>23781.786655</td>\n",
       "      <td>10376.965634</td>\n",
       "      <td>3584.071217</td>\n",
       "      <td>-489.994901</td>\n",
       "      <td>-3198.958126</td>\n",
       "      <td>-5898.759200</td>\n",
       "      <td>-9925.239905</td>\n",
       "      <td>-16549.585996</td>\n",
       "      <td>-29314.223366</td>\n",
       "      <td>-41151.872378</td>\n",
       "      <td>-51799.726695</td>\n",
       "      <td>-61135.816203</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  mkt_type mkt_asset mkt_class  mkt_point           -50           -40  \\\n",
       "0       IR       USD      CASH        O/N    -96.652300    -87.508851   \n",
       "1       IR       USD      CASH  CASH STUB  19236.462658  15938.264198   \n",
       "2       IR       USD       FRA      JUN20  58295.744762  48164.753974   \n",
       "\n",
       "            -30           -20           -10           -5          -2  \\\n",
       "0    -80.140622    -74.702595    -71.280237   -70.330161  -70.001395   \n",
       "1  12100.009823   7851.226480   3375.412126  1107.540696 -251.889772   \n",
       "2  36542.379396  23781.786655  10376.965634  3584.071217 -489.994901   \n",
       "\n",
       "             0            2            5            10            20  \\\n",
       "0   -69.881709   -69.840876   -69.925542    -70.448960    -72.866759   \n",
       "1 -1155.410051 -2055.450143 -3397.138702  -5601.994693  -9838.668869   \n",
       "2 -3198.958126 -5898.759200 -9925.239905 -16549.585996 -29314.223366   \n",
       "\n",
       "             30            40            50  \n",
       "0    -76.972091    -82.564403    -89.423074  \n",
       "1 -13744.821189 -17227.777252 -20248.264302  \n",
       "2 -41151.872378 -51799.726695 -61135.816203  "
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from gs_quant.markets import PricingContext\n",
    "from gs_quant.risk import MarketDataShockBasedScenario, MarketDataPattern, MarketDataShock, MarketDataShockType, Price, IRDeltaLocalCcy\n",
    "\n",
    "# calculate the base delta case (current delta of portfolio - 0bp shift in the rates)\n",
    "delta = portfolio.calc(IRDeltaLocalCcy).aggregate().rename(columns = {'value': 0})\n",
    "\n",
    "# calculate delta ladder (local delta for a number of shifts)\n",
    "shifts = [-50, -40, -30, -20, -10, -5, -2, 0, 2, 5, 10, 20, 30, 40, 50]\n",
    "results = {}\n",
    "with PricingContext(is_async=True):\n",
    "    for shift in shifts:\n",
    "        with MarketDataShockBasedScenario({\n",
    "            MarketDataPattern('IR', ccy): MarketDataShock(MarketDataShockType.Absolute, shift / 10000),\n",
    "            MarketDataPattern('IR Reset', '{}-3m'.format(ccy)): MarketDataShock(MarketDataShockType.Absolute, shift / 10000),\n",
    "            MarketDataPattern('IR Reset', '{}-6m'.format(ccy)): MarketDataShock(MarketDataShockType.Absolute, shift / 10000)\n",
    "        }):\n",
    "            results[shift] = portfolio.calc(IRDeltaLocalCcy)\n",
    "\n",
    "# aggregate delta and insert into dataframe\n",
    "for shift in shifts:\n",
    "    delta[shift] = results[shift].aggregate().value\n",
    "\n",
    "# insert base delta into sorted numerical column order    \n",
    "cols = list(delta.columns)\n",
    "column_list = cols[:4] + sorted(cols[4:])\n",
    "delta = delta[column_list]\n",
    "delta.head(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4 - Fit Polynomial\n",
    "\n",
    "With delta accross various shocks for each instrument in hand (the frame above), we can calculate a polynomial which fits the evolution of delta across the shifts for each instrument.\n",
    "\n",
    "`coeffs` will give us the polynomial (order number of shifts-1) coefficients for each instrument, thus `coeffs` is a matrix of size `len(delta)` x `len(shifts)` where each matrix row is a polynomial corresponding to the coefficients for each instrument. In this example it will be 30x15.\n",
    "\n",
    "We'll use this polynomial in the next step to extrapolate delta, gamma and performance to any market move.\n",
    "\n",
    "Note polynomial fitting is as much as art it is a science and additional techniques can be used here to avoid overfitting which can produce kinks and other undesirable effects."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "coeffs = [np.polynomial.polynomial.polyfit(shifts, row.values, len(shifts) - 1) for _, row in delta[shifts].iterrows()]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can now visualize what the polynomial looks for a particular point in the curve - '5Y' in the example below. The points in the graph are the shocks we fit the polynomial on for the '5Y' instrument.\n",
    "\n",
    "This means that for '5Y' instrument (and the rest of instruments in the table above) we can plug in any market move and get the expected delta (plug in x=spot and get y=delta, which we'll do in the next step)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'Delta')"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "point = '5Y'\n",
    "\n",
    "x = shifts\n",
    "y = delta[delta['mkt_point'] == point][shifts].values[0]\n",
    "coefficients = np.polyfit(x, y, len(x)-1)\n",
    "poly = np.poly1d(coefficients)\n",
    "\n",
    "new_x = np.linspace(x[0], x[-1], 100)\n",
    "new_y = poly(new_x)\n",
    "\n",
    "plt.plot(x, y, \"o\", new_x, new_y)\n",
    "plt.xlim([x[0]-1, x[-1] + 1])\n",
    "plt.title('Delta curve for {}'.format(point))\n",
    "plt.xlabel('Spot Move (bps)')\n",
    "plt.ylabel('Delta')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5 - Predicting Performance and Risk\n",
    "\n",
    "We can already get expected delta for any market move using our polynomial above - with a big of simple math, we can also get gamma (first derivative) and pnl approximation. Let's define a few functions to help us to that."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "def delta_f(inst_coeff, market_move):\n",
    "    return sum([c*market_move**(i) for i, c in enumerate(inst_coeff)])\n",
    "\n",
    "def gamma_f(inst_coeff, market_move):\n",
    "    return sum([(i + 1)*c*market_move**(i) for i, c in enumerate(inst_coeff[1:])])\n",
    "    \n",
    "def pnl_f(inst_coeff, market_move):\n",
    "    return sum([(c*market_move**(i + 1))/(i + 1) for i, c in enumerate(inst_coeff)])\n",
    "   \n",
    "def get_derived_values(inst_coeff, market_move):\n",
    "    b_delta = inst_coeff[0]\n",
    "    b_gamma = gamma_f(inst_coeff, 0)\n",
    "    \n",
    "    new_delta = delta_f(inst_coeff, market_move)\n",
    "    new_gamma = gamma_f(inst_coeff, market_move)\n",
    "\n",
    "    delta_pnl = b_delta * market_move\n",
    "    gamma_pnl = pnl_f(inst_coeff, market_move) - delta_pnl\n",
    "    \n",
    "    return {'current_delta': b_delta, 'current_gamma': b_gamma, 'new_delta': new_delta, 'new_gamma': new_gamma,\n",
    "            'delta_pnl': delta_pnl, 'gamma_pnl': gamma_pnl}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now imagine you have a live market data feed - you can plug that in for `market_moves` and get live risk on your book. You can also plug in any market move to predict pnl and risk for your book. \n",
    "\n",
    "Here I apply a flat 22bp move to all instruments but you can specify different moves for each instrument using the `market_moves` dictionary. As an example, I'll update O/N to 9bps and 10Y swap to 25."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "# plug in move (bps) - flat accross all instruments or construct custom dictionary\n",
    "move = 22\n",
    "market_moves = dict(zip(delta.mkt_point.values, len(delta.mkt_point)*[move]))\n",
    "market_moves['O/N'] = 9\n",
    "market_moves['10Y'] = 25"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's now calculate estimated delta, gamma and pnl given these market moves."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>current_delta</th>\n",
       "      <th>current_gamma</th>\n",
       "      <th>new_delta</th>\n",
       "      <th>new_gamma</th>\n",
       "      <th>delta_pnl</th>\n",
       "      <th>gamma_pnl</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mkt_point</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>O/N</th>\n",
       "      <td>-69.881709</td>\n",
       "      <td>0.040065</td>\n",
       "      <td>-70.306373</td>\n",
       "      <td>-0.133143</td>\n",
       "      <td>-628.935377</td>\n",
       "      <td>-0.742775</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CASH STUB</th>\n",
       "      <td>-1155.410051</td>\n",
       "      <td>-450.968775</td>\n",
       "      <td>-10675.092828</td>\n",
       "      <td>-418.613276</td>\n",
       "      <td>-25419.021126</td>\n",
       "      <td>-106376.459182</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>JUN20</th>\n",
       "      <td>-3198.958126</td>\n",
       "      <td>-1352.429189</td>\n",
       "      <td>-31787.348638</td>\n",
       "      <td>-1230.087633</td>\n",
       "      <td>-70377.078769</td>\n",
       "      <td>-319716.680302</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           current_delta  current_gamma     new_delta    new_gamma  \\\n",
       "mkt_point                                                            \n",
       "O/N           -69.881709       0.040065    -70.306373    -0.133143   \n",
       "CASH STUB   -1155.410051    -450.968775 -10675.092828  -418.613276   \n",
       "JUN20       -3198.958126   -1352.429189 -31787.348638 -1230.087633   \n",
       "\n",
       "              delta_pnl      gamma_pnl  \n",
       "mkt_point                               \n",
       "O/N         -628.935377      -0.742775  \n",
       "CASH STUB -25419.021126 -106376.459182  \n",
       "JUN20     -70377.078769 -319716.680302  "
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "\n",
    "# calculate values for all the instruments\n",
    "instruments = delta['mkt_point']\n",
    "results = pd.DataFrame([get_derived_values(coeffs[delta[delta['mkt_point'] == instrument].index[0]], \n",
    "                              market_moves[instrument]) for instrument in list(instruments)])\n",
    "results.index = instruments\n",
    "results.head(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We now have delta, gamma and delta given a specified move in each instrument. Current delta and gamma are values for the current portfolio and new delta and gamma are values after the market move is applied.\n",
    "\n",
    "Now to better understand the results, let's examine them visually! Note all of these values are approximations and may differ from actual performance and risk for the book."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x11d87160>"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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IyLeSW1OA64FugF3pwXgauAGSUvIRu7GpVgrJV0AzE71zo+IlWn9bGCypAuBeSmGmZmZdWB/+tOfOProo9l2220B+MxnPsO6det48MEHOfbYYzfWe/vttzcZ67777uPSSy/lzTffZOXKleyzzz4cccQRjdY/7rjjABg5ciSvv/46r732GgCHH344Xbt2pWvXruy444689NJLDBgwoNE4raEmCV5EvEk2sSFf9irZrNpy9S8CLipTPgf4UJnydaQEscy2a4BrypQ/Q3brFDMzMyuQ0tOo7777Lr169WL+/PkVx1i3bh2nn346c+bMYeDAgUycOHGT95or3W/9465du24s69y5Mxs2bKCt+btozczMrMMYOXIkt99+O2+99RZr1qzhzjvvZNttt2Xw4MHccks2zzMiePTRR9/TtkePHqxZswZgYzK3ww47sHbtWqZOnfqe+qVuvvlmAB544AF69uxJz54VXPfYRvxVZWZmZtZs1d7WpKX2228/Pv/5z7Pvvvuy2267cdBBBwFw4403ctppp3HhhReyfv16xo0bx9ChQxu0PeGEEzj11FM3TrI45ZRTGDJkCIMGDWL//fff5L579+7NgQceuHGSRXumbD6CQTaLds6cOW3dDTMzs+q10izaRYsWsddee7U4TkczatQoLrvsMurq6tpk/+WOu6S5EVG2Qz5Fa2ZmZlYwPkVrZmZmlpxxxhn8+c9/blB21llnMXPmzLbpUDM5wTMzMzNLfvGLX7R1F2rCp2jNzMzMCsYJnpmZmVnBOMEzMzMzKxgneGZmZmYF40kWZmZm1nyV3H+vqngtv1dfRzVx4kS6d+/ON7/5zRbH8giemZmZWcE4wTMzM7MO5YILLuCDH/wgn/zkJznuuOO47LLLuOqqq9h///0ZOnQon/vc53jzzTeB7OvJTjvtNA4++GB233137r//fk466ST22msvTjjhhI0xu3fvztlnn82wYcM47LDDmDVrFqNGjWL33Xdn2rRpACxdupSDDjqI/fbbj/32248HH3yw0T7OnDmTkSNHcvTRR7P33ntz6qmn8u67727c13e+8x2GDh3KiBEjeOmll2p+jJzgmZmZWYcxZ84cbr31VubNm8dtt91G/VeMfvazn2X27Nk8+uij7LXXXlx99dUb26xatYp7772XSZMmccQRR/CNb3yDhQsXsmDBAubPnw/A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\n",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "results[['delta_pnl', 'gamma_pnl']].plot(kind='bar', stacked=True, title='Gamma and Delta PnL given a {}bp move'.format(move), figsize=(10, 5))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x122aa198>"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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9tlNb3PhhRfy2GOPrfLrzpkzhz333HOV40iSpNVvjRiT1tnQyTe0Nd6cs97c1nidXXjhhey555684hWvWK2vI0mS6sOetB5y5plnsuuuu/LGN76Rhx56aGn5b3/7Ww477DDGjBnDAQccwIMPPrjMfldeeSXTp0/nXe96F6NGjeKZZ57h9NNPZ5999mHPPfdk0qRJZObLXu/xxx/nbW97GyNHjmTkyJH84he/AOCFF17gxBNPZPjw4Rx66KE888wzAJx//vnss88+jBw5kqOOOoqnn34agOOPP56PfOQj7L///uy0005ceeWVALz44oucdNJJDB8+nLe85S38wz/8w9J1M2bM4MADD2TMmDGMHz+eefPmtb9BJUnq50zSesCMGTO47LLLuOeee7j66quZNm3a0nWTJk3iq1/9KjNmzODss8/mpJNOWmbfo48+mrFjx3LppZdy7733st566/GhD32IadOmcf/99/PMM89w/fXXv+w1P/KRj3DggQcyc+ZM7r77boYPHw7A7NmzOfnkk5k1axabbropV111FQBvf/vbmTZtGjNnzmT33XdnypQpS2PNmzeP22+/neuvv57JkycDcPXVVzNnzhzuu+8+vvnNb3LHHXcA1eVOPvzhD3PllVcyY8YM3ve+93HKKae0t0ElSVoDrJGnO3vaz372M972trex/vrrA/DWt74VgMWLF/OLX/yCY445Zum2zz333Arj3XrrrXzpS1/i6aefZsGCBQwfPpzDDz98mW1uueUWLr74YgAGDhzIJptswsKFCxk2bBijRo0CYMyYMcyZMweA+++/n89+9rM8+eSTLF68mPHjxy+NdeSRRzJgwAD22GMPHn/8cQBuv/12jjnmGAYMGMA222zDwQcfDMBDDz3E/fffzyGHHAJUPXfbbrtty20mSdKaziSth3Q1O/HFF19k00035d577206zrPPPstJJ53E9OnT2X777TnttNNaujTFOuuss3R54MCBS093Hn/88Vx77bWMHDmSCy+8kNtuu63LfTpOrXZ1irWjfPjw4Ut71iRJzWtmzPTqHget+vB0Zw94/etfzzXXXMMzzzzDokWL+MEPfgDAxhtvzLBhw/je974HVAnOzJkzX7b/RhttxKJFiwCWJmRbbrklixcvXjoOrLNx48Zx7rnnAlVv1l//+tfl1nHRokVsu+22PP/881x66aUrPKbXve51XHXVVbz44os8/vjjS5O6XXfdlfnz5y9z+nPWrFkrjCdJkpZlktYDRo8ezbHHHsuoUaM46qijOOCAA5auu/TSS5kyZQojR45k+PDhfP/733/Z/scffzwf+MAHGDVqFOussw4nnngiI0aM4Mgjj2Sfffbp8jW//OUvc+uttzJixAjGjBmzwkTpjDPOYL/99uOQQw5ht912W+ExHXXUUQwZMoQ999yTf/qnf2K//fZjk002Ye211+bKK6/kU5/6FCNHjmTUqFFLJy1IkqTmRXenrfqqsWPH5vTp05cpe+CBB9h99917qUb91+LFi9lwww154okn2Hffffn5z3/ONttss9pez/dRUn/n6c41T0TMyMyxXa1rqictIjaNiCsj4sGIeCAiXhMRm0fE1IiYXX5u1rD9pyPi4Yh4KCLGN5SPiYj7yrqvRBmoFRHrRMTlpfzOiBjasM/E8hqzI2LiyjaC2u8tb3kLo0aN4oADDuBzn/vcak3QJEla0zQ7ceDLwA8z8+iIWBtYH/gMcHNmnhURk4HJwKciYg9gAjAceAXw44h4VWa+AJwLTAJ+CfwfcBhwI3ACsDAzd46ICcAXgWMjYnPgVGAskMCMiLguMxe25ei1ShonF0iSpPZaYU9aRGwMvB6YApCZf8/MJ4EjgIvKZhcBR5blI4DLMvO5zHwEeBjYNyK2BTbOzDuyOsd6cad9OmJdCYwrvWzjgamZuaAkZlOpEjtJkqR+rZnTnTsB84FvRcQ9EfHNiNgA2Doz5wGUn1uV7bcDHm3Yf24p264sdy5fZp/MXAI8BWyxnFiSJEn9WjNJ2lrAaODczNwb+BvVqc3uvPyCYNWpyu7KV3afl14wYlJETI+I6fPnz19O1SRJkvqGZpK0ucDczLyzPL+SKml7vJzCpPz8c8P22zfsPwR4rJQP6aJ8mX0iYi1gE2DBcmItIzPPy8yxmTl28ODBTRySJElSva0wScvMPwGPRsSupWgc8GvgOqBjtuVEoOMCX9cBE8qMzWHALsBd5ZToooh4dRlvdlynfTpiHQ3cUsat3QQcGhGbldmjh5Yy9ZDjjz++2wvmSpKk1afZ2Z0fBi4tMzt/B7yXKsG7IiJOAP4AHAOQmbMi4gqqRG4JcHKZ2QnwQeBCYD2qWZ03lvIpwCUR8TBVD9qEEmtBRJwBdNyR/PTMXLCSx/qS0zZZ5RDLxnuqvfEkSdIar6nrpGXmveV04l6ZeWRmLszMJzJzXGbuUn4uaNj+zMx8ZWbumpk3NpRPz8w9y7oPld4yMvPZzDwmM3fOzH0z83cN+1xQynfOzG+18+B70hlnnMFuu+3GIYccwjve8Q7OPvtsAM4//3z22WcfRo4cyVFHHcXTTz8NVD1YH/zgBzn44IPZaaed+MlPfsL73vc+dt99d44//vilcTfccEM+9alPMWbMGN74xjdy1113cdBBB7HTTjtx3XXXATBnzhwOOOAARo8ezejRo7u9A8DFF1/MXnvtxciRI3nPe96ztPynP/0p+++/PzvttNPSXrXFixczbtw4Ro8ezYgRI5beKWHOnDnsvvvunHjiiQwfPpxDDz106f1Bp02bxl577cVrXvMaPvnJT7LnnnsC1W2rPvnJT7LPPvuw11578b//+79tbHlJkvombwvVA6ZPn85VV13FPffcw9VXX03jHRHe/va3M23aNGbOnMnuu+/OlClTlq5buHAht9xyC+eccw6HH344H//4x5k1axb33Xff0puy/+1vf+Oggw5ixowZbLTRRnz2s59l6tSpXHPNNXz+858HYKuttmLq1KncfffdXH755XzkIx95WR1nzZrFmWeeyS233MLMmTP58pe/vHTdvHnzuP3227n++uuZPLmaM7LuuutyzTXXcPfdd3PrrbfyiU98YulN12fPns3JJ5/MrFmz2HTTTbnqqqsAeO9738s3vvEN7rjjDgYOHLg0/pQpU9hkk02YNm0a06ZN4/zzz+eRRx5pV/NLktQnNXu6U6vg9ttv54gjjmC99dYD4PDDD1+67v777+ezn/0sTz75JIsXL2b8+KU3aODwww8nIhgxYgRbb701I0aMAGD48OHMmTOHUaNGsfbaa3PYYdWl40aMGME666zDoEGDGDFiBHPmzAGqm5x/6EMf4t5772XgwIH85je/eVkdb7nlFo4++mi23HJLADbffPOl64488kgGDBjAHnvsweOPPw5UN4P/zGc+w09/+lMGDBjAH//4x6Xrhg0bxqhRowAYM2YMc+bM4cknn2TRokXsv//+ALzzne/k+uuvB+BHP/oRv/rVr5b20j311FPMnj2bYcOGrUqzS5LUp5mk9YDl3R/1+OOP59prr2XkyJFceOGFy1zFf5111gFgwIABS5c7ni9ZsgSAQYMGUe6utcx2jducc845bL311sycOZMXX3yRddddt8s6dsTprPG1O47l0ksvZf78+cyYMYNBgwYxdOhQnn322ZdtP3DgQJ555pnltkFm8tWvfnWZBFWSpDWdpzt7wOte9zp+8IMf8Oyzz7J48WJuuOGlG+guWrSIbbfdlueff55LL710tbz+U089xbbbbsuAAQO45JJLeOGFF162zbhx47jiiit44oknAFiwYPnzM5566im22morBg0axK233srvf//75W6/2WabsdFGG/HLX/4SgMsuu2zpuvHjx3Puuefy/PPPA/Cb3/yGv/3tby0doyRJ/Y09aT1gn3324a1vfSsjR45kxx13ZOzYsWyySTXD9IwzzmC//fZjxx13ZMSIESxatKjtr3/SSSdx1FFH8b3vfY+DDz6YDTbY4GXbDB8+nFNOOYUDDzyQgQMHsvfee3PhhRd2G/Nd73oXhx9+OGPHjmXUqFHstttuK6zHlClTOPHEE9lggw046KCDlrbB+9//fubMmcPo0aPJTAYPHsy111670scrSVJ/EMs7DdUXjR07NhsH5gM88MAD7L777r1Uo8rixYvZcMMNefrpp3n961/Peeedx+jRo3u1Tj2tow0AzjrrLObNm7fMBIUVqcP7KEmr09DJN6xwmzlnvbkHaqKeEhEzMnNsV+vsSeshkyZN4te//jXPPvssEydOXOMSNIAbbriBf//3f2fJkiXsuOOOy+2pkyRpTWeS1kO+853v9HYVet2xxx7Lscce29vVkCSpT3DigCRJUg2tMUlafxt7t6bx/ZMkrWnWiCRt3XXX5YknnvCLvo/KTJ544okur+8mSVJ/tUaMSRsyZAhz585l/vz5vV0VraR1112XIUOG9HY1JEnqMWtEkjZo0CBvMSRJkvqUNeJ0pyRJUl9jkiZJklRDJmmSJEk1ZJImSZJUQyZpkiRJNWSSJkmSVEMmaZIkSTVkkiZJklRDJmmSJEk1ZJImSZJUQyZpkiRJNWSSJkmSVEMmaZIkSTVkkiZJklRDJmmSJEk1ZJImSZJUQyZpkiRJNWSSJkmSVEMmaZIkSTVkkiZJklRDJmmSJEk1ZJImSZJUQyZpkiRJNdRUkhYRcyLivoi4NyKml7LNI2JqRMwuPzdr2P7TEfFwRDwUEeMbyseUOA9HxFciIkr5OhFxeSm/MyKGNuwzsbzG7IiY2K4DlyRJqrNWetIOzsxRmTm2PJ8M3JyZuwA3l+dExB7ABGA4cBjw9YgYWPY5F5gE7FIeh5XyE4CFmbkzcA7wxRJrc+BUYD9gX+DUxmRQkiSpv1qV051HABeV5YuAIxvKL8vM5zLzEeBhYN+I2BbYODPvyMwELu60T0esK4FxpZdtPDA1Mxdk5kJgKi8ldpIkSf1Ws0laAj+KiBkRMamUbZ2Z8wDKz61K+XbAow37zi1l25XlzuXL7JOZS4CngC2WE0uSJKlfW6vJ7V6bmY9FxFbA1Ih4cDnbRhdluZzyld3npResEsdJADvssMNyqiZJktQ3NNWTlpmPlZ9/Bq6hGh/2eDmFSfn557L5XGD7ht2HAI+V8iFdlC+zT0SsBWwCLFhOrM71Oy8zx2bm2MGDBzdzSJIkSbW2wiQtIjaIiI06loFDgfuB64CO2ZYTge+X5euACWXG5jCqCQJ3lVOiiyLi1WW82XGd9umIdTRwSxm3dhNwaERsViYMHFrKJEmS+rVmTnduDVxTrpaxFvCdzPxhREwDroiIE4A/AMcAZOasiLgC+DWwBDg5M18osT4IXAisB9xYHgBTgEsi4mGqHrQJJdaCiDgDmFa2Oz0zF6zC8UqSJPUJK0zSMvN3wMguyp8AxnWzz5nAmV2UTwf27KL8WUqS18W6C4ALVlRPSZKk/sQ7DkiSJNWQSZokSVINmaRJkiTVkEmaJElSDZmkSZIk1ZBJmiRJUg2ZpEmSJNWQSZokSVINmaRJkiTVkEmaJElSDZmkSZIk1ZBJmiRJUg2ZpEmSJNWQSZokSVINmaRJkiTVkEmaJElSDZmkSZIk1ZBJmiRJUg2ZpEmSJNWQSZokSVINmaRJkiTVkEmaJElSDZmkSZIk1ZBJmiRJUg2ZpEmSJNWQSZokSVINmaRJkiTVkEmaJElSDZmkSZIk1ZBJmiRJUg2ZpEmSJNWQSZokSVINmaRJkiTVkEmaJElSDZmkSZIk1ZBJmiRJUg01naRFxMCIuCciri/PN4+IqRExu/zcrGHbT0fEwxHxUESMbygfExH3lXVfiYgo5etExOWl/M6IGNqwz8TyGrMjYmI7DlqSJKnuWulJ+yjwQMPzycDNmbkLcHN5TkTsAUwAhgOHAV+PiIFln3OBScAu5XFYKT8BWJiZOwPnAF8ssTYHTgX2A/YFTm1MBiVJkvqrppK0iBgCvBn4ZkPxEcBFZfki4MiG8ssy87nMfAR4GNg3IrYFNs7MOzIzgYs77dMR60pgXOllGw9MzcwFmbkQmMpLiZ0kSVK/1WxP2n8D/wK82FC2dWbOAyg/tyrl2wGPNmw3t5RtV5Y7ly+zT2YuAZ4CtlhOLEmSpH5thUlaRLwF+HNmzmgyZnRRlsspX9l9Gus4KSKmR8T0+fPnN1lNSZKk+mqmJ+21wFsjYg5wGfCGiPg28Hg5hUn5+eey/Vxg+4b9hwCPlfIhXZQvs09ErAVsAixYTqxlZOZ5mTk2M8cOHjy4iUOSJEmqtxUmaZn56cwckplDqSYE3JKZ7wauAzpmW04Evl+WrwMmlBmbw6gmCNxVTokuiohXl/Fmx3XapyPW0eU1ErgJODQiNisTBg4tZZIkSf3aWquw71nAFRFxAvAH4BiAzJwVEVcAvwaWACdn5gtlnw8CFwLrATeWB8AU4JKIeJiqB21CibUgIs4AppXtTs/MBatQZ0mSpD6hpSQtM28DbivLTwDjutnuTODMLsqnA3t2Uf4sJcnrYt0FwAWt1FOSJKmv844DkiRJNWSSJkmSVEMmaZIkSTVkkiZJklRDJmmSJEk1ZJImSZJUQyZpkiRJNbQqF7OVJGmNN3TyDU1tN+esN6/mmqi/sSdNkiSphkzSJEmSasgkTZIkqYZM0iRJkmrIJE2SJKmGTNIkSZJqyCRNkiSphkzSJEmSasgkTZIkqYZM0iRJkmrIJE2SJKmGTNIkSZJqyCRNkiSphkzSJEmSasgkTZIkqYZM0iRJkmrIJE2SJKmGTNIkSZJqyCRNkiSphkzSJEmSasgkTZIkqYZM0iRJkmrIJE2SJKmGTNIkSZJqyCRNkiSphkzSJEmSasgkTZIkqYZM0iRJkmpohUlaRKwbEXdFxMyImBUR/1rKN4+IqRExu/zcrGGfT0fEwxHxUESMbygfExH3lXVfiYgo5etExOWl/M6IGNqwz8TyGrMjYmI7D16SJKmumulJew54Q2aOBEYBh0XEq4HJwM2ZuQtwc3lOROwBTACGA4cBX4+IgSXWucAkYJfyOKyUnwAszMydgXOAL5ZYmwOnAvsB+wKnNiaDkiRJ/dUKk7SsLC5PB5VHAkcAF5Xyi4Ajy/IRwGWZ+VxmPgI8DOwbEdsCG2fmHZmZwMWd9umIdSUwrvSyjQemZuaCzFwITOWlxE6SJKnfampMWkQMjIh7gT9TJU13Altn5jyA8nOrsvl2wKMNu88tZduV5c7ly+yTmUuAp4AtlhNLkiSpX2sqScvMFzJzFDCEqldsz+VsHl2FWE75yu7z0gtGTIqI6RExff78+cupmiRJUt/Q0uzOzHwSuI3qlOPj5RQm5eefy2Zzge0bdhsCPFbKh3RRvsw+EbEWsAmwYDmxOtfrvMwcm5ljBw8e3MohSZIk1VIzszsHR8SmZXk94I3Ag8B1QMdsy4nA98vydcCEMmNzGNUEgbvKKdFFEfHqMt7suE77dMQ6GriljFu7CTg0IjYrEwYOLWWSJHM3oiMAACAASURBVEn92lpNbLMtcFGZoTkAuCIzr4+IO4ArIuIE4A/AMQCZOSsirgB+DSwBTs7MF0qsDwIXAusBN5YHwBTgkoh4mKoHbUKJtSAizgCmle1Oz8wFq3LAkiRJfcEKk7TM/BWwdxflTwDjutnnTODMLsqnAy8bz5aZz1KSvC7WXQBcsKJ6SpIk9SfecUCSJKmGTNIkSZJqyCRNkiSphkzSJEmSasgkTZIkqYZM0iRJkmrIJE2SJKmGTNIkSZJqyCRNkiSphkzSJEmSasgkTZIkqYZM0iRJkmrIJE2SJKmGTNIkSZJqyCRNkiSphkzSJEmSasgkTZIkqYZM0iRJkmrIJE2SJKmGTNIkSZJqyCRNkiSphkzSJEmSasgkTZIkqYZM0iRJkmrIJE2SJKmGTNIkSZJqyCRNkiSphkzSJEmSasgkTZIkqYZM0iRJkmrIJE2SJKmGTNIkSZJqyCRNkiSphkzSJEmSamit3q6AJEnNGjr5hhVuM+esN/dATaTVz540SZKkGlphkhYR20fErRHxQETMioiPlvLNI2JqRMwuPzdr2OfTEfFwRDwUEeMbysdExH1l3VciIkr5OhFxeSm/MyKGNuwzsbzG7IiY2M6DlyRJqqtmetKWAJ/IzN2BVwMnR8QewGTg5szcBbi5PKesmwAMBw4Dvh4RA0usc4FJwC7lcVgpPwFYmJk7A+cAXyyxNgdOBfYD9gVObUwGJUmS+qsVJmmZOS8z7y7Li4AHgO2AI4CLymYXAUeW5SOAyzLzucx8BHgY2DcitgU2zsw7MjOBizvt0xHrSmBc6WUbD0zNzAWZuRCYykuJnSRJUr/V0pi0chpyb+BOYOvMnAdVIgdsVTbbDni0Ybe5pWy7sty5fJl9MnMJ8BSwxXJiSZIk9WtNJ2kRsSFwFfCxzPzr8jbtoiyXU76y+zTWbVJETI+I6fPnz19O1SRJkvqGppK0iBhElaBdmplXl+LHyylMys8/l/K5wPYNuw8BHivlQ7ooX2afiFgL2ARYsJxYy8jM8zJzbGaOHTx4cDOHJEmSVGvNzO4MYArwQGb+V8Oq64CO2ZYTge83lE8oMzaHUU0QuKucEl0UEa8uMY/rtE9HrKOBW8q4tZuAQyNiszJh4NBSJkmS1K81czHb1wLvAe6LiHtL2WeAs4ArIuIE4A/AMQCZOSsirgB+TTUz9OTMfKHs90HgQmA94MbygCoJvCQiHqbqQZtQYi2IiDOAaWW70zNzwUoeqyRJUp+xwiQtM2+n67FhAOO62edM4MwuyqcDe3ZR/iwlyeti3QXABSuqpyRJUn/iHQckSZJqyCRNkiSphkzSJEmSasgkTZIkqYZM0iRJkmrIJE2SJKmGTNIkSZJqyCRNkiSphkzSJEmSaqiZ20JJkqQ+ZujkG1a4zZyz3twDNdHKsidNkiSphkzSJEmSasgkTZIkqYZM0iRJkmrIJE2SJKmGTNIkSZJqyCRNkiSphkzSJEmSasgkTZIkqYZM0iRJkmrIJE2SJKmGTNIkSZJqyCRNkiSphkzSJEmSasgkTZIkqYZM0iRJkmrIJE2SJKmG1urtCkiS1BuGTr5hhdvMOevNPVATqWv2pEmSJNWQSZokSVINmaRJkiTVkEmaJElSDZmkSZIk1ZBJmiRJUg2ZpEmSJNWQSZokSVINrTBJi4gLIuLPEXF/Q9nmETE1ImaXn5s1rPt0RDwcEQ9FxPiG8jERcV9Z95WIiFK+TkRcXsrvjIihDftMLK8xOyImtuugJUmS6q6ZnrQLgcM6lU0Gbs7MXYCby3MiYg9gAjC87PP1iBhY9jkXmATsUh4dMU8AFmbmzsA5wBdLrM2BU4H9gH2BUxuTQUmSpP5shUlaZv4UWNCp+AjgorJ8EXBkQ/llmflcZj4CPAzsGxHbAhtn5h2ZmcDFnfbpiHUlMK70so0HpmbmgsxcCEzl5cmiJElSv7SyY9K2zsx5AOXnVqV8O+DRhu3mlrLtynLn8mX2ycwlwFPAFsuJJUmS1O+1e+JAdFGWyylf2X2WfdGISRExPSKmz58/v6mKSpIk1dnKJmmPl1OYlJ9/LuVzge0bthsCPFbKh3RRvsw+EbEWsAnV6dXuYr1MZp6XmWMzc+zgwYNX8pAkSZLqY2WTtOuAjtmWE4HvN5RPKDM2h1FNELirnBJdFBGvLuPNjuu0T0eso4Fbyri1m4BDI2KzMmHg0FImSZLU7621og0i4rvAQcCWETGXasblWcAVEXEC8AfgGIDMnBURVwC/BpYAJ2fmCyXUB6lmiq4H3FgeAFOASyLiYaoetAkl1oKIOAOYVrY7PTM7T2CQJEnql1aYpGXmO7pZNa6b7c8EzuyifDqwZxflz1KSvC7WXQBcsKI6SpIk9TfecUCSJKmGTNIkSZJqyCRNkiSphkzSJEmSasgkTZIkqYZM0iRJkmpohZfgkCStfkMn37DCbeac9eYeqImkurAnTZIkqYZM0iRJkmrIJE2SJKmGTNIkSZJqyCRNkiSphkzSJEmSasgkTZIkqYa8TpokrSSvbSZpdbInTZIkqYZM0iRJkmrIJE2SJKmGHJMmSeqSY+6k3mVPmiRJUg2ZpEmSJNWQSZokSVINOSZNkvqRZsaRgWPJpL7AnjRJkqQaMkmTJEmqIZM0SZKkGjJJkyRJqiGTNEmSpBoySZMkSaohkzRJkqQaMkmTJEmqIZM0SZKkGjJJkyRJqiGTNEmSpBoySZMkSaohb7AuSZJ6xNDJN6xwmzlnvbkHatI39ImetIg4LCIeioiHI2Jyb9dHkiRpdat9khYRA4GvAW8C9gDeERF79G6tJEmSVq/aJ2nAvsDDmfm7zPw7cBlwRC/XSZIkabXqC2PStgMebXg+F9ivcYOImARMAthhhx1Wa2XadT69mTjtjNXsOf6ePL461qmdsep4fHWsUztj9fTxzVn3nU282lNNbNO+WM3FaWes5o7PNm9nrJ49vnb+7vVknaDvj2/rC0ladFGWyzzJPA84D2Ds2LHZxfaS1H6nNfdl2aOx6linuvL4el6b6tTXk69m9YUkbS6wfcPzIcBjvVQXSb1kTfmjrBXox4lH22Opz+sLSdo0YJeIGAb8EZgANNu3LK0x2pnEtCtWXROrutZLkhrVPknLzCUR8SHgJmAgcEFmzurlakmSJK1WtU/SADLz/4D/6+16gP+Bq/38TEmSutInkjSt2ep46s3ESpK0uvWF66RJkiStcUzSJEmSasjTnf1AHU/jeTpQkqRVY0+aJElSDZmkSZIk1ZBJmiRJUg05Jq2XOGZLkiQtjz1pkiRJNWSSJkmSVEMmaZIkSTVkkiZJklRDJmmSJEk15OxOSZLULa9G0HtM0iRJq51f9FLrPN0pSZJUQyZpkiRJNWSSJkmSVEMmaZIkSTVkkiZJklRDJmmSJEk1ZJImSZJUQyZpkiRJNWSSJkmSVEMmaZIkSTVkkiZJklRDJmmSJEk1ZJImSZJUQyZpkiRJNRSZ2dt1aKuImA/8volNtwT+0oaXbFecusayTj0fyzr1fCzr1POxrFPPx7JOPR+rmTg7Zubgrlb0uyStWRExPTPH1iVOXWNZp56PZZ16PpZ16vlY1qnnY1mnno+1qnE83SlJklRDJmmSJEk1tCYnaefVLE5dY1mnno9lnXo+lnXq+VjWqedjWaeej7VKcdbYMWmSJEl1tib3pEmSJNWWSZokSVINmaS1ICLWiogoy9tHxNERsXdv10uSJPU/JmlNiogTgT8Dvy/LNwNHA5dFxKdajDU+Is6NiOsi4vtl+bDVUO1aiojd2hDj8+2oS11ExKAuyrZsYf/xEXFCRAztVP6+Va9dfUTEgIgYUJbXjojREbF5izF2bGN92hLLOgkgIv4lIgbWKZZ16p1YHfp9khYR34qIC7p5TGkh1MeAVwKvA/4b2D8zJwB7A8e1UJ//Bj4K/AT4EvAfZfkjEfHlFurTGHOTiDg2Iv45Ij5eljddiThrRcQ/RcQPI+JXETEzIm6MiA90lUSsgh+1Icb72xBjqYg4pI2xmp7NExEHR8Rc4LGI+FGnJKupdoqIfwNOAUYAN0fEhxtWf6jZunSKuXFEvLKL8r1ajDOwfKbOiIjXdlr32RZjHQnMA/4YEUcAPwPOBn4VEYe3EOrmiJgcEWu18vqrOZZ1alI//6LfEZjR+Xell2NZp96JBawBszsj4qguinegSroGZuaQJuPck5l7l+WZmTmyq3VNxPlNZr6qi/IAfpOZuzQTp2G/44BTqb7Q/1iKhwCHAP+amRe3EOu7wJPARcDchlgTgc0z89gWYn2lu1XAxMzcuIkYf11OjPUysx1fHh2v9YfM3KGF7bvrvQlgZgufq2nA8Zk5KyKOBv4deE9m/rLZz1VE3AfsnZlLSnL+HeChzPx4K5/Nhnj/SPWPyJ+BQaV+08q6uzNzdAuxvgmsD9wFvAf4SWb+80rGugd4E7AeMBPYJzMfKr00VzV7Ve+I2Ag4HXgD8OHM/GmzdVhdsaxTS7G+BrwWODkzf97bcVZDrNHAV4EHgXOBFzvWZebdvRHLOvVOLFgDkrRGEbET8Bng9cA5wJTM/HuT+z4IvIOq9/HbwDupvpAD+HZm7t5knF8B78/MuzqV71vqM6LJw+nY7yFgv8x8slP5ZsCdXSWEy4uVmbt2s67L5HI5sRYBnwCe62L1f2bmCk/lRcQfqL6IH+9i3aOZuX2z9Sn7XNfdKuANmblBC7FeoLpHbDQUZ3m+XWau3WSczgn/cOBqYDLwuWaSmIh4oPHzV/6jPw/YGNgjM4c3U5eG/e8F3pSZ88rn8mLgM5l5datJX0T8KjP3KstrAV+nupfdO4Bfthir8R+l+zNzz4Z1LSV8ZZ8xVMMW5lL9IQ0gO+rbG7GsU9Nx+vsX/UHAVcB9VH9XSph8Qytx2hnLOvVOrLb1RNRZROxOdTpob6rTix/IzCUthvkT8F9dLHc8b9bxwLnlP8uO3qrtgb+Wda0KXvoQNOr4A9iKhRFxDFWvxItQjQECjgEWthhrGnB/Zv6i84qIOK3JGBdTdR+/LEmj6i1q1QHAu4HFnasE7NtirN8B4zLzD51XRMSjLcR5PiK2ycw/AZQetXHA9VSn15vx24g4MDN/UmK8AJwQEV8AuupJXpGBmTmvxLorIg4Gro+IIXT9WVuepclq+Z2bFNV4wluADVutWEQMKJ/N9zWUDWx8nSbjvAH4MvBN4Gs0fKGuRJ3aEss6NS8z746IU6i+CF9JwxchVW9dj8ZpV6yI2Ar4T2Anqn8cZ7ZSh9URyzr1TqylMrNfP4DvAY8AJwODgc0bH71Yr22AMcBYYJtViDMR+C3Vf26fKY9vlLLjW4w1FLgcmA/8pjz+XMqGtRhrc2D93n7/O9XpRuDgbtb9tMVYJwMju1n34RbivLGrOMAmwClNxliP6vRvV+u2W4l2+gXwyk5lG1H1gDzXYqxvA4d1Uf5+4PkWY+0DrNtF+VDg3S3EuYxqPNuINnym2hJrDarTnm2ItRVwCfDz7n4HezJOm+v0O2AS5SzXKtapLbGsU+/E6nj0+9OdETGHZf+jgZd6mDIzd2oyzts7FSXwF+DezFy0EvUalJnPdyrbMjP/shKxNgPGA9tRHdtc4KbMbLX3qzHmFlQftJbr027tbKv+rF3tFBEjgaczc3bn+MA/Zualq17b3hMRJ2bm+Z3KLs7MpicAdRcrIl5H1St7f2Y2PUGm9C5+JTOfjIj1qE53jwZ+DfxbZj7VQqxPApdlZis9ul3F+TBVD/8fM/PHEfFOYH/gAeC8zp+1FcQ6EbgVOJLqzMESYDbw3VaOrcT6HXAWcH6uwhdYu+K0uU6DM3P+qtSl3bGsU+/E6tDvZ3cCO2fmsPLYqTyWPm8hzuGdHm8F/h/VzLKmu8WjDbP5OsvMhZl5WWb+Z2aeXZZXKkGLMqsvM59o/HKP1mf1bRwR/x4Rl5Q/7o3rvt5kjLa3VTtFG2ZA1rGdMnNm5wStlD+/MglaO9qpIc4qtVXx1qguf9Px+AHw9o7nrdQJOLGhDicC/0PV63hqRExuIc6xvHQa/stUPalfBJ4GvtVinT4L3BkRP4uIkyJicIv7d3gN8A/ARyPiEqphD3dS9Wh+s8VY61ONR1y37L8eVbJ2Rxm/04r9MvO8VU2s2hinnbH+HhFnRcSDEfFEeTxQylqdsT+mYyEiNo2IKVHN2v9ORGxtndpep3bXq9KuLrm6PoDpwLXAB4ChqyH+jlQD9JvdfhowvCwfTfXf5KvL83tW4vW356VTCZ8BBjWsu7bFWP8IPAbcC8yiGrTfse7uFmNdRfWf5ZHAdeX5Oq3EWhPaynbq2c9Ux7ZUp2EPAg4sP+eV5QNbrNM9DcvTgMFleQPgvhbiPNBdu1D11rdUJ6p/wA8FplANX/gh1dCIjVqI86vycy2qcaEDy/PoWNdCrPsa9l8fuK0s79DqZ5QqgT2LaoD+E+XxQCnbtIU4G1PNpr4EeGendV9vsU6HNSxvWtr9V1RjZ7duIc5NwKdoGAJDNTTmU8DUFut0d8PyN4EvUH1ffbyV32Pr1FKsttVr6f4rs1Nfe5QG/wBVsjaNambnoZQ/8G2I38oXxMxOz4cDDwFvayVOw/5Ty7GNoppZ9Atgi7Ku1T9+9wLbluV9yx/Bt69srE7PT6Ear7FFs8e5JrSV7dSzn6my34DyB3gqMKqU/a7Vdupoe2CzUofpnda18jn4HvDesvwtYGxZfhUwrcU6dU7yBlH1/H8XmN9CnPupJmRsBiyijOGl6g17oMU63cdLCfVmwIzG12kxVlu+CGlT0t95e1Yt+fjNctY9tAp16vy703Tib51aitW2ei3db2V26ouP8odlBLAX1bWWvkR17aYbVjHursAdLWw/nU4TBaiuRXYvsGglXr/zh+rdVD0Wr1yJPzT3dXq+LTAD+MhKxHoAGNCpbGKp2+9tK9upNz5TXbTR96hOUf6h1f1LjDlUg4UfKT+3KeUbtvilswlwIdWEnzuB50u8n9DiQHSWkxzSzQSTbrb9eKnD78v7dTNwPlXCdWqLdfooVc/SeVSJekdCOpjWJ+205Yuwi8/5SiX9Zd92JR8/Av6Fht43YGuqBPTHLdZpLvDPVJdC+h0Ng9lpoSfUOrUUq2316nj0+0twRHVtpn8D3gv8geq/6CFUfxBfR/VHopk4P+Dllx/YnOpL590tVGky1Zu29LIdmTm3jMs4uYU4HQZFxLqZ+WyJ9e2I+BPVf5tNX/erWFTGo/22xJpX6nUtVe9MK35ANe38xx0FmXlRRDxO1TvTjDWhrWyn5rWjrZbKzLnAMRHxZqoB8i3LzKHdrHqRqiez2ThPAcdHdWmenahOMc7NLq4R2IRuLzqdmc+0UKdzIuLysvxYRFxMNRv5/Ox0nccmYn05In4M7A78V2Y+WMrnU123shVzIuJfgIs62qeMHToeaGWyxDrx0iVdyMwzy9jOn9L65WG2ioh/pjoVvHFERJZvaFob+30s1e/zT8oxJdWp5uuohg604nyq8ZFQXaB8S2B+RGxD9Q9cf6oTVH//ftCLdeqqXqvSVgBrxOzOc6jegI9nmYUZERtT3U7m6cz8WJNxDuxUlFRjIWZnkxfEXR0i4uNU/8X9pFP53sCXMrPp2x1FNavvb5n5cKfy/jKrz7Zqgu2kOotqNvtk4AiqS1/AS1+EZ2WTk6Yi4kvAjzLzx53KDwO+mi3c/SUiTu1U9PXM7Pii/1K2MHM4qnsbD6G62PPihvLDMvOHzcZpiLUd1bjplY4V1UWtMzOnRXXB7cOoTnn/Xyv16SLWHiXWgysTq1PcSzLzPasSoyHWSs327iLOAVTDPO7LFmZ7LxNjDUjSZgOvyk4HGtUFMB9s9hcxIn6UmYe2oT630v0FQTMzx61k3FW+JEVE7EzVTfvzTuUHAI919Ia0EG8gsFlHvSJibar/dj+eTdyhYU1pK9uppXir1Fbq3yLivZn5rbrEaTVWRHyEqvf7AaoxoR/NzO+Xda3eRu3DVPfuXaVYJQF9E1Xv7lSqpOMnVL2qN2XmmS3UqXOs/YDbWo0VXc/CfgPVRbLJzLe2UKd2xrorM/cty++nei+vpRoD/4PMPKvZWEutzDnSvvRg+eMXul3XxbYtD8DuJs6YLh4nU437aGmAcIl3ONXsrXlU59b3X4W6XQ/s1UX52PIBayXWBOApqpl9PwEOLvW7BhhtW9lOvfGZ8tG/H6zk2MLVFafVWFTj/TYsy0Opxpt+tDxvdaJNW2KVOAOpZuX+Fdi4lK/HSs7yXdVYtHmGdjtjNSyv9Gzvxke/H5MG/DoijstONxqPiHdTDWBt1qbx8gvaLpWZVzcTJDNnNNThQOBzwDpUt6q6sYX6dDgTOCAzH4yI/agmRHQ+NdusoZn5qy7qPD2WvfZWMz4LjMnMh6O6p90dwITMvKbZAGtIW9lOzVvltlLfF9X9j7tcRTU2s0fjtDnWwCynJTNzThm/eWVE7FhitaJdsZZkdau5pyPit5n51xLzmYho9dZe7Yo1lmoyyinAJzPz3oh4JjsN0WjSmDbGGlBOxw+gOlM5HyAz/xYRrd6KElgz7t15MnB1RLyPalZZ8tLFFJse2Es1++otdP3hTqqbYjclIsZTfZE+C5yZmbe2UI/OluRLg3DvLAOPV9a6y1m3Xoux/p5lHFJW97R7ZGW+TNeAtrKdmteWtlKftzXVHVY6jz0LqsvF9HScdsb6U0SMysx7ATJzcUS8BbiA6uoErWhXrL9HxPqZ+TTLXvh1E1q//2pbYmU12eOciPhe+fk4K5nPtDMWVZ4wg+p9zyj3ZY6IDWk9yYZVqEifkZl/BPaL6q4Aw6ka6sbMvLnFUL/PzPeteLPli4hpVDNK/4OqJ4DSK9BR37tbDNkxq6jL55n5X13s051p0fUtc06g+uCtSr02bLVea0hb2U4rX6+W20r9wvVUp/FeNvMuIm7rhTjtjHUc1S2zlsrMJcBxEfG/LdapXbFen5nPlf0bE6lBVJfAaUU7Y5FtmKHdzljZptnejfr9xIF2iYh7MnPvNsS5jeUP8m76FlMlXudZRZ0D/msLsbamGt/zd176Ah1LdUHLt2Xmn7rbt8V6ZWae3kSM2+jnbWU79exnSpL6EpO0JkXEnpl5f8PzLaiu7/OHxjFB/UFEHAzsWZ7Oysxb2hx/n8yc1s6YvWV1tpXt1FL8ftNWktTBJK1JEXE9MDkz74+Ibalml0ynugr7eZn5303G6Tz5IIG/UF2VetFK1OuKzPzHsvzFzPxUw7qWLhsSEW/o+PKMiGGZ+UhjvbPJyRHdxN6DanbeO4CnMnNsE/uscW1lO7VUz5bbSpL6EpO0JkXErMwcXpY/A+yWmceVQdU/z8y9mozT1fVyNqe6XdUJrfYwNJ6GjU7Xvmn1FG3j/l3EaukaPWWfHam+QN9BNTZiR6p7Es5pcv81oq1sp5bqtkptJUl9Sb+fONBGzzcsj6O6lQSZuShamDqcme/tqrx8+VxBdXG/Viwvy241A49ulrt6vvxAEb+gmulyGXB0Zs4us/HmNBtjTWgr26mFQG1oK0nqS0zSmvdoVFdwnguMBn4IEBHrUc1MWSWZ+fuobpXTqvWjul3PAGC9hll9QeuXOMhulrt6viLzqW5tsjXVzMPZKxGjS/2srWyn5q22tpKkOvJ0Z5MiYivgdKobqn8ty324yoDoMZl59irG3xW4MDNf0+J+HbcE6uiVaHxDIzMPbiHWk1Q3Fw7ggLJMef66zNysxbptAhxFdWpqZ2BTYHy2eHPmLuL2q7aynVqq22ppK0mqI5O0HhYRP+Dl//1vTpX8vSczW7qIYlQ3q300M+eV5xOpvsTmAKdl5oIWYi33qvK5cldg7oi9NXAs1UDv7TNz+yb2WePaynZqqZ4tt5Uk9SUmaT2sfGl1PgX0BDA7M5/veq/lxrsbeGNmLoiI11ON1/kw1Q11d8/Mo1eynoMBstzWop0iYsfM/H0T263RbWU7tRS7qbaSpL7EJK2HRcQilj2VBC99wT4H/BY4JZu8I0JEzMzMkWX5a8D8zDytPL83M0e1ULcAPk/1hRxUY5KWAF/NFi8UGhHXLW99Zr61iRj9vq1sp+a1o60kqS9x4kAPy8xu74MYEQOpLvh5KS9d+HNFBkbEWlnd7mMcMKlhXavv78eA1wH7dFzPKiJ2As6NiI9n5jktxHoN8CjwXeBOWpzJB2tMW9lOzVvltpKkvsSetCZFxFdZzkyyzPxIG1/rnzKzqXurRcQpwD9QXbx0B2B0ZmZE/P/27i/0krKO4/j7Y7JughFhLIjUz22TEF32QkSpBEOFjCDpYv2DYchSkbQGQiiRZTdKgn8hL7pok828aSEwY8WSWLPURdk/EFvUQrR04VXiLq243y5mfu3xcHad3+nszuz83i/4ceY8M/PM9/dwYL4888zzbAC2VdWnV3Dd14HrqurNqfKPAjtXOD/WB4DraAZ4bwSeBZ6uqv1d6+h4nTO6rWyn4f2mJGkoTNI6agdPL/sB8J51BKtq2+mN6LgkV9IMEt9ZVW+3ZRfTLPjbeXHtJPuqamZvy8n2daj3HJob64+A+6vq8XnqWYQht5XttKL4BtNWknSq+Lizo8kkLMldfSZl06rqjzPKDsxR1dE5983U3ki/QHMzXQIeA+ZeBmgRhthWtlN3Q2wrSTpV7EmbQ+ZYzuZMkORd4O1Zu4C1VdV5YtQk22jGQD0H/KImFqcfg0W1le3kb0qSTsQkbQ5jTdIWKc1SWcs35/dMhgpUVX3o9Ec1PLZTd7aVpNXGJK2jiWkOAM4FDjMxI7s3CEmStEgmaZIkSQPkiwMdJTkXeGd5Bvd2XcQbgINVtaPX4CRJ0uic1XcAZ5Df0LxNRjtf1MvAeuDOJA/0GJckSRohH3d2lGRvVV3Wbv8Q+EhVfTPJGmD38j5JkqRFsCetu8ls9nPA8wBVdRQ4EFdMcQAAA5JJREFU1ktEkiRptByT1t2eJA8B/wQ2ADsBkny416gkSdIo2ZPW3RaatQyXgOur6nBbfgnwUF9BSZKkcbInraOqOgLMekHgH0DnBaclSZK6sCdtDknOT/KNJL8HXgTW9RySJEkaGXvSOkpyHnAjcAtwMbADWF9VF/YamCRJGiWn4OgoyRHgFeC7wK6qqiR/q6r1PYcmSZJGyMed3d0LrAV+DNyT5BM9xyNJkkbMnrQVSrIeuBm4CfgkcB+wo6oO9BqYJEkaFZO0/0OSy2gSts1VZc+aJElaGJO0jtr1OtdV1UtT5VcDh6rqr/1EJkmSxsgxad09Arw1o/ww8PBpjkWSJI2cSVp3S1W1Z7qwql6jWYVAkiRpYUzSult7kn0fPG1RSJKkVcEkrbtXk2yZLkxyB7C7h3gkSdKI+eJAR0nW0awycJTjSdnlwBrgxqr6V1+xSZKk8TFJW6Ek1wCXtl/3V9Vv+4xHkiSNk0maJEnSADkmTZIkaYBM0iRJkgbIJE2SJGmATNIkrSpJvp/k7hnltye5YMHX+nqSr7zPMZuS3LDI60oah7P7DkCSBuJ2YB9waFEVVtWTHQ7bRDOdz68XdV1J42BPmqTRSLKU5M9JfpJkX5LtSa5N8lKSvyS5Yur4LUmeS3IbTaK0PckbSWauIpLkYJIHk7zS/m1oyz+e5IUke9rPj7Xl/+u1S/LixLkHknw2yRrgfmBze93Np7J9JJ1ZTNIkjc0G4FFgI/Ap4BbgM8DdwL3LByW5E/gi8KWqegp4Dbi1qjZV1ZGT1P/vqroCeAJ4pC17AvhZVW0EtgOPneDcs9tz7wLuq6qjwPeAZ9rrPjPXfyxplEzSJI3N36tqb1UdA/YDL1QzIeReYKk95jbg88CXq+o/K6z/6YnPq9rtq4Cft9tP0SSFs/yy/dw9EYskzWSSJmlsJpOuYxPfj3F8HO4+miTpwjnqrxNsn+iYWbG9i2OCJb0PkzRJq9HrwNeAX0280fkWcF6HczdPfL7cbv8BuKndvhXYtYJYul5X0ipjkiZpVaqqXTTj1J5Ncj7wU+DJk7040DonyZ+ArcC327JvAV9NsofmUerWFYTyO+ASXxyQNM21OyWpoyQHgcur6s2+Y5E0fvakSZIkDZADVyVpSpIdwEVTxd+pqqUewpG0Svm4U5IkaYB83ClJkjRAJmmSJEkDZJImSZI0QCZpkiRJA2SSJkmSNED/BTHHgHtg+KXDAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "risk_changes = pd.DataFrame([results.new_delta - results.current_delta, results.new_gamma - results.current_gamma]).T\n",
    "risk_changes.columns = ['delta change', 'gamma change']\n",
    "risk_changes.plot(kind='bar', stacked=True, figsize=(10, 6), title='Risk changes given a {}bp move'.format(move))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Please reach out with your thoughts and feedback!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### What's New\n",
    "\n",
    "* New `IRXccySwapFixFlt` and `IRXccySwapFixFix` instruments (`from gs_quant.instruments import IRXccySwapFixFlt, IRXccySwapFixFix`)\n",
    "* Improved error handling\n",
    "* Improved computational efficiency - see `4-Delta Hedging` for examples"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}